package com.kylefu.design.pattern.proxy;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

/**
 * 代理模式的定义：为其他对象提供一种代理以控制对这个对象的访问。在某些情况下，一个对象不适合或者不能直接引用另一个对象，而代理对象可以在客户端和目标对象之间起到中介的作用。
 */
public class ProxyExample {

  public static void main(String[] args){
    //静态代理
    ProxyImage proxyImage = new ProxyImage("test.png");
    proxyImage.displayImage();

    try {
      System.out.println("------动态代理------");
      String fileName = "test.png";
      //动态代理，cglib方式执行方法
      Class cls = RealImage.class;
      Constructor construct = cls.getDeclaredConstructor(String.class);
      Object obj = construct.newInstance(fileName);
      Method method = cls.getDeclaredMethod("displayImage");
      method.invoke(obj);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

}
